#include <QtGui/QApplication>

#include <boost/circular_buffer.hpp>
#include "RadarPlot.h"
#include <vector>
#include <complex>
#include <boost/thread.hpp>
//
//using namespace std;
//
//boost::circular_buffer<vector<complex<double> > > dataBuffer(1200);
//
//void probing() {
//    while(true) {
//        vector<complex<double> > vec;
//        complex<double> sample;
//        for(int i=0; i < 1000; i++) {
//            sample.real(10);
//            sample.imag(12);
//            vec.push_back(sample);
//        }
//        
//        dataBuffer.push_front(vec);
//        usleep(1000);
//    }
//}
//
//int main(int argc, char *argv[]) {
//    QApplication app(argc, argv);
//    
//    boost::thread probingThread(probing);
//    
//    RadarPlot plot;
//    
//    plot.setDataBuffer(&dataBuffer);
//    plot.show();  
//    
//    return app.exec();
//}

#include <iostream>
#include <boost/thread.hpp>
#include <boost/circular_buffer.hpp>
#include "Echo.hxx"
#include "Transmitter.hxx"
#include "Utils.hxx"
#include "Receiver.hxx"
#include "Environment.hxx"
#include "Pulse.hxx"

using namespace std;

//GLOBALNE ZMIENNE
int const echoBufferSize = 1280;
//boost::circular_buffer<Echo> echoBuffer(echoBufferSize);
boost::circular_buffer<vector<complex<double> > > echoBuffer(echoBufferSize);


void initEnvironment(Environment& env) {
    Coordinates c1(1000, 1000, 1000), c2(1010, 1010, 5000);     //obiekty 1 i 2 w pierwszej cwiartce
    Coordinates c3(-1200, 4000, 3800), c4(-3500, 2200, 5000);   //obiekty 3 i 4 w drugiej cwiartce
    Coordinates c5(-3000, -3000, 6000), c6(-5000, -7000, 2000); //obiekty 5 i 6 w trzeciej cwiartce
    Coordinates c7(3000, -4000, 9000), c8(2800, -4500, 7500); //obiekty 7 i 8 w czwartej cwiartce
    
    Velocity v1(50, 50, -50), v2(-10, -10, 5);
    Velocity v3(15, 10, 5), v4(20, -5, -10);
    Velocity v5(-10, 10, 25), v6(-20, -30, 40);
    Velocity v7(50, 50, -20), v8(30, 50, -5);

    Target t1(c1, v1), t2(c2, v2);
    t1.setHeight(100);
    t1.setLength(100);
    Target t3(c3, v3), t4(c4, v4);
    Target t5(c5, v5), t6(c6, v6);
    Target t7(c7, v7), t8(c8, v8);

    env.addTarget(t1);
    env.addTarget(t2);
    env.addTarget(t3);
    env.addTarget(t4);
    env.addTarget(t5);
    env.addTarget(t6);
    env.addTarget(t7);
    env.addTarget(t8);
}

void probing(Environment& env) {
    Pulse pulse(10);
    Antenna antenna;
    Transmitter transmitter;
    Receiver receiver;
    Echo echo;
    while(true) {
        echo = Echo(Utils::RANGE_BINS_COUNT);
        transmitter.ping(pulse);
        env.getResponse(&pulse, &echo);
        receiver.pong(echo);
        echoBuffer.push_front(echo);
        antenna.updateState();
        usleep(1000000 * 1/Antenna::PRF);    // czekamy 1/prf SEKUND
        if(Antenna::IS_NEW_ROUND) {  //tutaj damy sprawdzanie czy juz nastapil pelen obroti
            cout << "Round#" << Antenna::ROUND_NUMBER << endl;
            env.updateEnvironment(); //aktualnizujemy sytuacje w powietrzu
        }
        echo.clear();
    }
}

int main(int argc, char *argv[]) {
    Environment env;
    initEnvironment(env);
    boost::thread probingThread(probing, env);
    sleep(1);
    
    QApplication app(argc, argv);
    
    RadarPlot plot;
    
    plot.setDataBuffer(&echoBuffer);
    plot.show();  
    
    return app.exec();
    
}